#ifndef __ZOMBIESWARM_H__
#define __ZOMBIESWARM_H__

#include "Zombie.h"

class ZombieManager;

class ZombieSwarm {

 private:

  // Atributos Bullet --------------------------------------------------

  btDiscreteDynamicsWorld* _pWorld;

  // Atributos Ogre ----------------------------------------------------

  Ogre::SceneManager* _pSceneManager;

  // Atributos OpenSteer -----------------------------------------------

  OpenSteer::Vec3 _swarmCenter;

  // Otros atributos ---------------------------------------------------

  ZombieManager* _pZombieManager;

  std::list<Zombie*> _zombies;
  std::list<Zombie*>::iterator _zombiesIt;

  Human* _pHuman; // Puntero a humano
  int _nZombies; // Número de zombis de la horda
  int _maxDistance; // Distancia máxima de los zombis al centro

  // Métodos própios privados ------------------------------------------

  // Calcular el centro de la horda
  void updateSwarmCenter();

 public:

  // Constructores y destructores --------------------------------------

  ZombieSwarm(btDiscreteDynamicsWorld* pWorld,
              Ogre::SceneManager* pSceneManager,
              OpenSteer::Vec3 position,
              ZombieManager* pZombieManager,
              Human* pHuman);

  ~ZombieSwarm() {}

  // Métodos propios ---------------------------------------------------

  // Actualizar la posición de la horda
  void update(const float currentTime, const float elapsedTime);

  // Devolver centro de la horda
  OpenSteer::Vec3 swarmCenter() const { return _swarmCenter; }

  // Calcular la distancia máxima
  void updateMaxDistance();

  // Calcular una posición inicial aleatoria para cada zombi
  OpenSteer::Vec3 randomPositionInSwarm() const;

  // Devolver distancia máxima
  float maxDistance() const { return _maxDistance; }

  // Incluir un zombi en la horda
  void addZombie(Zombie* pZombie);

  // Quitar un zombi de la horda
  void removeZombie(Zombie* pZombie);
};

#endif

